home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / GMI2PIC.ASM < prev    next >
Assembly Source File  |  1986-05-27  |  22KB  |  568 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = PIC2IMG.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.  
  7. CR           EQU     0DH
  8. LF           EQU     0AH
  9.  
  10. PIC           DB      'PIC',0
  11. IMG           DB      'GMI',0
  12. FILENAME       DB      128 DUP(0)
  13. HANDLE_IN      DW      0
  14. HANDLE_OUT     DW      0
  15. TYPE_FROM      DW      0
  16.  
  17. LAST_CHAR      DB      0
  18. CHAR_COUNT     DW      1
  19.  
  20. BYTE_CNT_H     DW      0
  21. BYTE_CNT_L     DW      0
  22.  
  23. LINES_PER_READ DW      0
  24. READS_PER_FILE DW      0
  25. BYTES_PER_READ DW      0
  26.  
  27. DISK_BUFFER    DD      0
  28.  
  29. ;44 BYTES
  30. IMG_NAME       DB      'FILE GENERATED FROM PCPAINT   '
  31. IMG_HEIGHT     DW      0
  32. IMG_WIDTH      DW      0
  33. IMG_WIDTH_BYTE DW      0
  34. IMG_PIX_SIZE   DW      1
  35. IMG_PIX_FMT    DW      0
  36. IMG_COLOR      DW      0
  37. IMG_COMPRESS   DW      0
  38.  
  39. PIC_PAGE       DW      1234H               ;START OF PAGE
  40. PIC_WIDTH      DW      0               ;WIDTH OF IMAGE
  41. PIC_HEIGHT     DW      0               ;HEIGHT OF IMAGE
  42. PIC_X_OFF      DW      0               ;X OFFSET OF PIC
  43. PIC_Y_OFF      DW      0               ;Y OFFSET OF PIC
  44. PIC_PIX_SIZE   DB      1               ;SIZE OF PEL
  45. PIC_2           DB      0FFH               ;PCPAINT 2.0
  46. PIC_MODE       DB      'G'                     ;TYPE OF DISPLAY
  47. PIC_DESC       DW      0               ;DESCRIPTOR
  48. PIC_COUNT      DW      0               ;COUNT
  49. PIC_BLOCK      DW      1               ;NUMBER OF PACKED BLOCKS
  50.  
  51. PIC_PAC_SZ     DW      0               ;NUMBER OF PACKED BYTES IN BLOCK
  52. PIC_NORM       DW      0               ;NUMBER OF BYTES UNPACKED
  53. PIC_ID           DB      0               ;IDENTIFIER
  54.  
  55. TELL_HOW       DB      '┌──────────────────────────────────────────────┐',cr,lf
  56.            DB      '│ GMI2PIC filename.typ                         │',cr,lf
  57.            DB      '├──────────────────────────────────────────────┤',cr,lf
  58.            DB      '│ filename = GMI file created with MIRROR.EXE  │',cr,lf
  59.            DB      '│ typ      = must end in GMI                   │',cr,lf
  60.            DB      '├──────────────────────────────────────────────┤',cr,lf
  61.            DB      '│ Converts GMI (reverse image file to PIC file │',cr,lf
  62.            DB      '│ PIC file = PC-Paint Plus format (Mouse Sys)  │',cr,lf
  63.            DB      '└──────────────────────────────────────────────┘',cr,lf
  64.            DB      7,'$'
  65. OPEN_ERROR     DB      'file not found...must end in GMI',cr,lf,'$'
  66. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  67. ;╔═════════════════════════════════════════════════════════════════════════════╗
  68. ;║ ░░░░░░░░░░░ MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  69. ;╚═════════════════════════════════════════════════════════════════════════════╝
  70. MAIN           PROC    FAR
  71. ;┌─────────────────────────────────────────────────────────────────────────────┐
  72. ;│           RETURN SETUP                               │
  73. ;└─────────────────────────────────────────────────────────────────────────────┘
  74.            CLI
  75.            MOV     AX,CS               ;TEMP STACK
  76.            MOV     SS,AX               ;
  77.            MOV     ES,AX               ;
  78.            MOV     SP,OFFSET STACK           ;
  79.            STI
  80.            PUSH    DS               ;
  81.            XOR     AX,AX               ;
  82.            PUSH    AX               ;
  83.            CLD
  84. ;┌─────────────────────────────────────────────────────────────────────────────┐
  85. ;│           GET FILENAME FROM COMMAND LINE                       │
  86. ;└─────────────────────────────────────────────────────────────────────────────┘
  87.            MOV     SI,82H               ;START OF FILENAME
  88.            XOR     CH,CH               ;
  89.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  90.            CMP     CX,0               ;NO COMMANDS
  91.            JE      GFN800               ;ERROR
  92.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  93. GFN100:
  94.            LODSB                   ;GET CHARACTER
  95.            CMP     AL,20H               ;END OF FILENAME?
  96.            JE      GFN900               ;YES....BRANCH
  97.            CMP     AL,CR               ;END OF COMMAND LINE?
  98.            JE      GFN900               ;YES....ERROR
  99.            STOSB                   ;SAVE CHARACTER
  100.            CMP     AL,'.'                  ;START OF TYPE
  101.            JNE     GFN200               ;
  102.            MOV     CS:TYPE_FROM,DI           ;START OF TYPE
  103. GFN200:
  104.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  105.            JMP     SHORT GFN800           ;ERROR IF DONE ALREADY
  106. GFN800:
  107.            MOV     DX,OFFSET TELL_HOW      ;
  108.            JMP     ERROR               ;
  109. GFN900:
  110.            MOV     AL,0               ;PUT NULL AT END OF STRING
  111.            STOSB                   ;
  112.            CMP     WORD PTR CS:TYPE_FROM,0 ;
  113.            JNE     SET_BREAK
  114.            DEC     DI
  115.            MOV     CS:TYPE_FROM,DI
  116. ;┌─────────────────────────────────────────────────────────────────────────────┐
  117. ;│           TURN BREAK KEY ON                           │
  118. ;└─────────────────────────────────────────────────────────────────────────────┘
  119. SET_BREAK:
  120.            MOV     AX,CS               ;SET DATA SEGMENT
  121.            MOV     DS,AX               ;
  122.            CALL    BREAK_ON            ;SET UP CONTROL BREAK
  123. ;┌─────────────────────────────────────────────────────────────────────────────┐
  124. ;│           FIND DISK MEMORY                            │
  125. ;└─────────────────────────────────────────────────────────────────────────────┘
  126.            MOV     AX,OFFSET PROG_END      ;
  127.            MOV     BX,CS               ;
  128.            SHR     AX,1               ;
  129.            SHR     AX,1               ;
  130.            SHR     AX,1               ;
  131.            SHR     AX,1               ;
  132.            ADD     BX,AX               ;
  133.            ADD     BX,8               ;
  134.            MOV     WORD PTR DISK_BUFFER+2,BX      ;
  135. ;┌─────────────────────────────────────────────────────────────────────────────┐
  136. ;│           CHECK  FILENAME                               │
  137. ;└─────────────────────────────────────────────────────────────────────────────┘
  138.            MOV     SI,OFFSET IMG           ;CHANGE TYPE ON FILENAME
  139.            MOV     DI,TYPE_FROM           ;
  140.            MOV     CX,3               ;
  141.            AND     BYTE PTR [DI],0DFH        ;MAKE CAPITOL LETTER
  142.            AND     BYTE PTR [DI+1],0DFH        ;MAKE CAPITOL LETTER
  143.            AND     BYTE PTR [DI+2],0DFH        ;MAKE CAPITOL LETTER
  144.            REP     CMPSB               ;
  145.            JNE     OIF050
  146. ;┌─────────────────────────────────────────────────────────────────────────────┐
  147. ;│           OPEN INPUT FILE                               │
  148. ;└─────────────────────────────────────────────────────────────────────────────┘
  149.            MOV     AH,3DH               ;OPEN FILE FOR READ
  150.            MOV     AL,0H               ;
  151.            MOV     DX,OFFSET FILENAME      ;
  152.            INT     21H               ;
  153.            JNC     OIF100
  154. OIF050:
  155.            MOV     DX,OFFSET OPEN_ERROR    ;
  156.            JMP     ERROR
  157. OIF100:
  158.            MOV     HANDLE_IN,AX
  159. ;┌─────────────────────────────────────────────────────────────────────────────┐
  160. ;│           CHANGE FILENAME                               │
  161. ;└─────────────────────────────────────────────────────────────────────────────┘
  162.            MOV     SI,OFFSET PIC           ;CHANGE TYPE ON FILENAME
  163.            MOV     DI,TYPE_FROM           ;
  164.            MOV     CX,3               ;
  165.            REP     MOVSB               ;
  166. ;┌─────────────────────────────────────────────────────────────────────────────┐
  167. ;│           CREATE OUTPUT TEMP FILE                           │
  168. ;└─────────────────────────────────────────────────────────────────────────────┘
  169.            MOV     AH,3CH               ;
  170.            MOV     CX,20H               ;
  171.            MOV     DX,OFFSET FILENAME      ;
  172.            INT     21H               ;
  173.            JNC     COF100
  174.            MOV     DX,OFFSET CREATE_ERROR  ;
  175.            JMP     ERROR
  176. COF100:
  177.            MOV     HANDLE_OUT,AX
  178. ;┌─────────────────────────────────────────────────────────────────────────────┐
  179. ;│           READ IMG HEADER                               │
  180. ;└─────────────────────────────────────────────────────────────────────────────┘
  181.            MOV     AH,3FH
  182.            MOV     BX,HANDLE_IN
  183.            MOV     CX,44
  184.            MOV     DX,OFFSET IMG_NAME
  185.            INT     21H
  186. ;┌─────────────────────────────────────────────────────────────────────────────┐
  187. ;│           TRANSLATE TO PIC HEADER                           │
  188. ;└─────────────────────────────────────────────────────────────────────────────┘
  189.            MOV     AX,IMG_HEIGHT           ;GET IMG HEIGHT
  190.            MOV     PIC_HEIGHT,AX           ;MOV TO PIC HEIGHT
  191.            MOV     AX,IMG_WIDTH_BYTE       ;GET IMG WIDTH
  192.            SHL     AX,1
  193.            SHL     AX,1
  194.            SHL     AX,1
  195.            MOV     PIC_WIDTH,AX           ;MOV TO PIC WIDTH
  196. ;┌─────────────────────────────────────────────────────────────────────────────┐
  197. ;│           CALCULATE NUMBER OF BLOCKS                       │
  198. ;└─────────────────────────────────────────────────────────────────────────────┘
  199.            MOV     AX,IMG_HEIGHT           ;LINES * BYTES PER LINE =
  200.            MOV     CX,IMG_WIDTH_BYTE       ;  FILE SIZE
  201.            MUL     CX               ;DX:AX = FILE SIZE
  202.            MOV     BYTE_CNT_L,AX           ;SAVE SIZE
  203.            MOV     BYTE_CNT_H,DX           ;
  204.            MOV     CX,2000H            ;MAX PIC PACKET SIZE
  205.            DIV     CX               ;AX = NUMBER OF PACKETS -1
  206.            INC     AX
  207.            MOV     PIC_BLOCK,AX
  208. ;┌─────────────────────────────────────────────────────────────────────────────┐
  209. ;│           WRITE PIC HEADER                            │
  210. ;└─────────────────────────────────────────────────────────────────────────────┘
  211.            MOV     AH,40H
  212.            MOV     BX,HANDLE_OUT
  213.            MOV     CX,19
  214.            MOV     DX,OFFSET PIC_PAGE
  215.            INT     21H
  216. ;┌─────────────────────────────────────────────────────────────────────────────┐
  217. ;│           MOVE PICTURE DATA BETWEEN FILES                       │
  218. ;└─────────────────────────────────────────────────────────────────────────────┘
  219. READ_BLOCK:
  220.            CALL    PROCESS_PAC
  221.            DEC     PIC_BLOCK
  222.            JZ      CLOSE_FILE
  223.            JMP     READ_BLOCK
  224. ;┌─────────────────────────────────────────────────────────────────────────────┐
  225. ;│           CLOSE FILES                               │
  226. ;└─────────────────────────────────────────────────────────────────────────────┘
  227. CLOSE_FILE:
  228.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  229.            MOV     AH,3EH               ;
  230.            INT     21H               ;
  231.            MOV     BX,HANDLE_OUT           ;CLOSE FILE
  232.            MOV     AH,3EH               ;
  233.            INT     21H               ;
  234.  
  235.            JMP     EXIT
  236. ERROR:
  237.            MOV     AX,CS
  238.            MOV     DS,AX
  239.            MOV     AH,9
  240.            INT     21H
  241. EXIT:
  242.            CALL    BREAK_OFF           ;BREAK KEY RESET
  243.            RET                   ;
  244. MAIN           ENDP
  245.  
  246. ;╔═════════════════════════════════════════════════════════════════════════════╗
  247. ;║ ░░░░░░░░░░░ PROCESS PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  248. ;╚═════════════════════════════════════════════════════════════════════════════╝
  249. PROCESS_PAC    PROC    NEAR
  250.  
  251.            CALL    READ_IMAGE           ;AX = NUMBER OF BYTES READ
  252.            CMP     AX,0
  253.            JE      PP200
  254.            SUB     BYTE_CNT_L,AX
  255.            JNC     PP100
  256.            CMP     BYTE_CNT_H,0
  257.            JE      PP050
  258.            DEC     BYTE_CNT_H
  259.            JMP     SHORT PP100
  260. PP050:
  261.            ADD     BYTE_CNT_L,AX
  262.            MOV     AX,BYTE_CNT_L
  263. PP100:
  264.            CALL    PAC_IMAGE
  265.            CALL    WRITE_PAC_HDR
  266.            CALL    WRITE_PAC
  267. PP200:
  268.            RET
  269.  
  270. PROCESS_PAC    ENDP
  271. ;╔═════════════════════════════════════════════════════════════════════════════╗
  272. ;║ ░░░░░░░░░░░ WRITE_PAC_HEADER ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  273. ;╚═════════════════════════════════════════════════════════════════════════════╝
  274. ;┌─────────────────────────────────────────────────────────────────────────────┐
  275. ;│           WRITE 5 BYTE PACKET HEADER                       │
  276. ;└─────────────────────────────────────────────────────────────────────────────┘
  277. WRITE_PAC_HDR  PROC    NEAR
  278.  
  279.            PUSH    AX               ;SAVE REGISTERS
  280.            PUSH    BX               ;
  281.            PUSH    CX               ;
  282.            PUSH    DX               ;
  283.                            ;
  284.            MOV     AH,40H               ;
  285.            MOV     BX,HANDLE_OUT           ;
  286.            MOV     CX,5               ;
  287.            MOV     DX,OFFSET PIC_PAC_SZ    ;
  288.            INT     21H               ;
  289.                            ;
  290.            POP     DX               ;RESTORE REGISTERS
  291.            POP     CX               ;
  292.            POP     BX               ;
  293.            POP     AX               ;
  294.            RET
  295.  
  296. WRITE_PAC_HDR  ENDP
  297. ;╔═════════════════════════════════════════════════════════════════════════════╗
  298. ;║ ░░░░░░░░░░░ WRITE PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  299. ;╚═════════════════════════════════════════════════════════════════════════════╝
  300. WRITE_PAC      PROC    NEAR
  301.  
  302.            PUSH    AX               ;SAVE REGISTERS
  303.            PUSH    BX               ;
  304.            PUSH    CX               ;
  305.            PUSH    DX               ;
  306.            PUSH    DS
  307.                            ;
  308.            MOV     AH,40H               ;
  309.            MOV     BX,HANDLE_OUT           ;
  310.            MOV     CX,PIC_PAC_SZ           ;
  311.            SUB     CX,5               ;NO NEED TO WRITE HEADER
  312.            LDS     DX,DISK_BUFFER           ;
  313.            ADD     DX,8000H            ;
  314.            INT     21H               ;
  315.                            ;
  316.            POP     DS
  317.            POP     DX               ;RESTORE REGISTERS
  318.            POP     CX               ;
  319.            POP     BX               ;
  320.            POP     AX               ;
  321.            RET
  322.  
  323. WRITE_PAC    ENDP
  324. ;╔═════════════════════════════════════════════════════════════════════════════╗
  325. ;║ ░░░░░░░░░░░ PAC IMAGE ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  326. ;╚═════════════════════════════════════════════════════════════════════════════╝
  327. ;┌─────────────────────────────────────────────────────────────────────────────┐
  328. ;│           COMPRESS PACKET                               │
  329. ;└─────────────────────────────────────────────────────────────────────────────┘
  330. PAC_IMAGE      PROC    NEAR
  331.  
  332.            PUSH    AX               ;SAVE REGISTERS
  333.            PUSH    BX               ;
  334.            PUSH    CX               ;
  335.            PUSH    DX               ;
  336.            PUSH    DI               ;
  337.            PUSH    SI               ;
  338.            PUSH    DS               ;
  339.            PUSH    ES               ;
  340.            cld
  341.  
  342.            MOV     PIC_NORM,AX           ;SIZE OF PACKET
  343. ;┌─────────────────────────────────────────────────────────────────────────────┐
  344. ;│           CLEAR FLAGS BUFFER                           │
  345. ;└─────────────────────────────────────────────────────────────────────────────┘
  346.            PUSH    AX
  347.            MOV     AX,CS
  348.            MOV     ES,AX
  349.            XOR     AX,AX
  350.            MOV     DI,OFFSET FLAGS
  351.            MOV     CX,256
  352.            REP     STOSB
  353.            POP     AX
  354. ;┌─────────────────────────────────────────────────────────────────────────────┐
  355. ;│           FIND CHARACTER IN PACKET NOT USED                   │
  356. ;└─────────────────────────────────────────────────────────────────────────────┘
  357.            PUSH    AX
  358.            MOV     CX,AX               ;USE AS COUNTER
  359.            PUSH    DS               ;SET ES TO DS
  360.            POP     ES               ;LOOK THROUGH BUFFER AND
  361.            LDS     SI,DISK_BUFFER           ;FLAG ANY CHARACTER USED
  362.            MOV     DI,OFFSET FLAGS           ;
  363. FC400:
  364.            LODSB                   ;GET CHARACTER
  365.            MOV     BL,AL               ;SETUP OFFSET WITH CHARACTER
  366.            XOR     BH,BH               ;
  367.            INC     BYTE PTR ES:[DI+BX]     ;SET FLAG FOR CHARACTER
  368.            LOOP    FC400               ;DO UNTIL DONE
  369.            PUSH    ES               ;RESTORE DS
  370.            POP     DS               ;
  371. FC500:
  372.            MOV     SI,OFFSET FLAGS           ;
  373.            XOR     AL,AL
  374. FC525:
  375.            MOV     CX,256               ;
  376.            XOR     BX,BX
  377. FC550:
  378.            CMP     BYTE PTR DS:[SI+BX],AL
  379.            JE      FC600               ;NO...USE IT FOR ID TAG
  380.            INC     BX
  381.            LOOP    FC550
  382.            INC     AL               ;LOOK FOR NEXT LEAST USED CHAR.
  383.            JMP     SHORT FC525
  384. FC600:
  385.            MOV     PIC_ID,BL
  386.            POP     CX               ;RESTORE BUFFER SIZE
  387. ;┌─────────────────────────────────────────────────────────────────────────────┐
  388. ;│           START COMPRESSION                           │
  389. ;└─────────────────────────────────────────────────────────────────────────────┘
  390.            LES     DI,DISK_BUFFER           ;DESTINATION
  391.            ADD     DI,8000H            ;
  392.            LDS     SI,DISK_BUFFER           ;SOURCE
  393.            LODSB
  394.            MOV     CS:LAST_CHAR,AL           ;
  395. SC100:
  396.            LODSB                   ;
  397.            CMP     AL,CS:LAST_CHAR           ;
  398.            JNE     SC300               ;
  399.            INC     CS:CHAR_COUNT           ;
  400.            LOOP    SC100               ;
  401. SC300:
  402.            PUSH    AX               ;SAVE NEW CHARACTER
  403.            CMP     CS:CHAR_COUNT,4           ;IS IT MORE THAN 3 CHARACTERS
  404.            JB      SC500               ;NO PRINT 3 CHARACTERS
  405. SC325:
  406.            MOV     AL,CS:PIC_ID           ;GET TAG CHARACTER
  407.            STOSB
  408.            MOV     BX,CS:CHAR_COUNT        ;
  409.            CMP     BH,0               ;16 BIT?
  410.            JNE     SC400
  411.            MOV     AL,BL
  412.            STOSB
  413. SC350:
  414.            MOV     AL,CS:LAST_CHAR
  415.            STOSB
  416.            JMP     SHORT SC700
  417. SC400:
  418.            MOV     AL,0
  419.            STOSB
  420.            MOV     AX,BX
  421.            STOSW
  422.            JMP     SHORT SC350
  423. SC500:                           ;NOT MORE THAN 3 IN A ROW
  424.            MOV     AL,CS:LAST_CHAR           ;PRINT CHARACTERS
  425.            CMP     AL,CS:PIC_ID           ;IS IT ID BYTE
  426.            JE      SC325               ;SEND AS STRING
  427. SC600:
  428.            STOSB                   ;
  429.            DEC     CS:CHAR_COUNT           ;
  430.            JNZ     SC600               ;
  431. SC700:                           ;
  432.            POP     AX               ;
  433.            MOV     CS:LAST_CHAR,AL           ;
  434.            MOV     CS:CHAR_COUNT,1           ;
  435.            CMP     CX,0
  436.            LOOPNZ  SC100
  437.  
  438.            SUB     DI,8000H-5
  439.            MOV     CS:PIC_PAC_SZ,DI
  440.  
  441.            POP     ES               ;RESTORE REGISTERS
  442.            POP     DS               ;
  443.            POP     SI               ;
  444.            POP     DI               ;
  445.            POP     DX               ;
  446.            POP     CX               ;
  447.            POP     BX               ;
  448.            POP     AX               ;
  449.            RET
  450.  
  451. PAC_IMAGE      ENDP
  452. ;╔═════════════════════════════════════════════════════════════════════════════╗
  453. ;║ ░░░░░░░░░░░ READ IMAGE  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  454. ;╚═════════════════════════════════════════════════════════════════════════════╝
  455. READ_IMAGE     PROC    NEAR
  456.  
  457.            PUSH    BX               ;
  458.            PUSH    CX               ;
  459.            PUSH    DX               ;
  460.            PUSH    DS
  461.  
  462.            MOV     AH,3FH               ;
  463.            MOV     BX,HANDLE_IN           ;
  464.            MOV     CX,2000H            ;
  465.            LDS     DX,DISK_BUFFER           ;
  466.            INT     21H               ;
  467.  
  468.            POP     DS
  469.            POP     DX               ;RESTORE REGISTERS
  470.            POP     CX               ;
  471.            POP     BX               ;
  472.            RET
  473.  
  474. READ_IMAGE     ENDP
  475. ;┌─────────────────────────────────────────────────────────────────────────────┐
  476. ;└─────────────────────────────────────────────────────────────────────────────┘
  477. EOI          EQU      20H              ;END OF INTERRUPT
  478. BRKINT          EQU      1BH              ;BREAK INTERRUPT
  479. SAV_BRK       DW       ?
  480. ;╔═════════════════════════════════════════════════════════════════════════════╗
  481. ;║ ░░░░░░░░░░ BREAK_ON ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  482. ;╚═════════════════════════════════════════════════════════════════════════════╝
  483.           PUBLIC   BREAK_ON
  484. BREAK_ON      PROC     NEAR
  485.           PUSH     AX
  486.           PUSH     BX               ;SAVE REGISTERS
  487.           PUSH     CX               ;
  488.           PUSH     DX               ;
  489.           PUSH     SI               ;
  490.           PUSH     ES               ;
  491.  
  492.           XOR      BX,BX               ;SEGMENT 0
  493.           MOV      ES,BX               ;
  494.           MOV      SI,BRKINT*4           ;OFFSET OF INTERUPT VECTOR
  495.  
  496.           MOV      CX,ES:WORD PTR[SI]      ;OFFSET OF CURRENT VECT
  497.           MOV      DX,ES:WORD PTR[SI+2]    ;SEGMENT OF CURRENT VECT
  498.           MOV      CS:SAV_BRK,CX           ;SAVE OFFSET
  499.           MOV      CS:SAV_BRK+2,DX           ;SAVE SEGMENT
  500.  
  501.           MOV      AX,OFFSET BREAK           ;
  502.           CLI                   ;NO INTERRUPTS
  503.           MOV      ES:WORD PTR[SI],AX      ;SET OFFSET
  504.           MOV      AX,CS               ;SET THIS CODE SEGMENT
  505.           MOV      ES:WORD PTR[SI+2],AX    ;MOVE SEG ADDR TO INT.VECT
  506.           STI                   ;INTERRUPTS BACK ON
  507.  
  508.           POP      ES               ;RESTORE REGISTERS
  509.           POP      SI               ;
  510.           POP      DX               ;
  511.           POP      CX               ;
  512.           POP      BX               ;
  513.           POP      AX               ;
  514.           RET                   ;
  515. BREAK_ON      ENDP
  516. ;╔═════════════════════════════════════════════════════════════════════════════╗
  517. ;║ ░░░░░░░░░░ BREAK_OFF ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  518. ;╚═════════════════════════════════════════════════════════════════════════════╝
  519.           PUBLIC   BREAK_OFF
  520. BREAK_OFF     PROC     NEAR
  521.  
  522.           PUSH     AX               ;
  523.           PUSH     CX               ;
  524.           PUSH     DX               ;
  525.           PUSH     DI               ;
  526.           PUSH     ES               ;
  527.  
  528.           XOR      AX,AX               ;
  529.           MOV      ES,AX               ;SEGMENT 0
  530.           MOV      CX,CS:SAV_BRK           ;RESET VECTOR BACK TO OLD RTN
  531.           MOV      DX,CS:SAV_BRK+2           ;
  532.           MOV      DI,BRKINT*4           ;
  533.           CLI                   ;NO INTERRUPTS
  534.           MOV      ES:WORD PTR[DI],CX      ;
  535.           MOV      ES:WORD PTR[DI+2],DX    ;
  536.           STI                   ;INTERRUPTS BACK ON
  537.  
  538.           POP      ES               ;
  539.           POP      DI               ;
  540.           POP      DX               ;
  541.           POP      CX               ;
  542.           POP      AX               ;
  543.           RET                   ;
  544. BREAK_OFF     ENDP
  545. ;╔═════════════════════════════════════════════════════════════════════════════╗
  546. ;║ ░░░░░░░░░░ BREAK ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║ J
  547. ;╚═════════════════════════════════════════════════════════════════════════════╝
  548.           PUBLIC   BREAK
  549. BREAK          PROC     FAR
  550.  
  551.           MOV      AX,CS
  552.           MOV      DS,AX
  553.           MOV      AL,EOI               ;
  554.           OUT      020H,AL               ;
  555.           CALL     BREAK_OFF
  556.           MOV      SP,OFFSET STACK-4       ;
  557.           RET
  558.  
  559. BREAK          ENDP
  560. ;┌─────────────────────────────────────────────────────────────────────────────┐
  561. ;└─────────────────────────────────────────────────────────────────────────────┘
  562. FLAGS           DB      256 DUP(0)
  563.            DB      64 DUP('STACK')
  564. STACK           EQU     $
  565. PROG_END       EQU     $
  566. CSEG           ENDS
  567.            END     MAIN
  568.